home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 13288 / 13288.xpi / content / listmanager.js < prev    next >
Text File  |  2010-01-24  |  15KB  |  360 lines

  1. var stmList = {
  2.     gPrefs: Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("extensions.stm."),
  3.  
  4.     init: function() {
  5.        this.initDialog();
  6.        var e = document.getElementById("filterChilds");
  7.        e.addEventListener("DOMAttrModified", this.updateApplyButton, false);
  8.        e.addEventListener("DOMNodeInserted", this.updateApplyButton, false);
  9.        e.addEventListener("DOMNodeRemoved", this.updateApplyButton, false);
  10.        document.addEventListener("keypress", this.onKeyPressed, false);
  11.  
  12.     },
  13.  
  14.     initDialog: function() {
  15.        //filter
  16.        document.getElementById('filtercbx').checked = this.gPrefs.getBoolPref("pagelock.filter");
  17.        var list = this.getPrefFilterList();
  18.        var rules = document.getElementById('filterChilds');
  19.        while (rules.hasChildNodes()) rules.removeChild(rules.firstChild);
  20.        for (var i = 0; i < list.length; i++) {
  21.           if (list[i] != "") {
  22.              var item = list[i].split("\b");
  23.              var rule = item[0];
  24.              var enabled = (item.length == 1);
  25.              this.addFilterRule(rule, enabled);
  26.         }
  27.        }
  28.        //fill urlbox
  29.        var newurl = window.opener.gBrowser?window.opener.gBrowser.currentURI.spec:"";
  30.        var u = document.getElementById('urlbox');
  31.        u.value = newurl.indexOf("://") < 0 ? "" : newurl;
  32.        u.select();
  33.  
  34.        //updateStatus
  35.        this.updateDialogAllStatus();
  36.        this.updateApplyButton(false);
  37.     },
  38.  
  39.     getPrefFilterList: function() {
  40.        var s = this.gPrefs.getComplexValue("pagelock.filterlist", Components.interfaces.nsISupportsString).data;
  41.        return (s ? s.split(" ") : "");
  42.     },
  43.  
  44.     addFilterRule: function(rule, enabled) {
  45.        var rules = document.getElementById('filterChilds');
  46.        var item = document.createElement('treeitem');
  47.        var row = document.createElement('treerow');
  48.        var c1 = document.createElement('treecell');
  49.        var c2 = document.createElement('treecell');
  50.        c1.setAttribute('label', rule);
  51.        c2.setAttribute('value', enabled);
  52.        row.appendChild(c1);
  53.        row.appendChild(c2);
  54.        item.appendChild(row);
  55.        rules.appendChild(item);
  56.        return (rules.childNodes.length-1);
  57.     },
  58.  
  59.     updateDialogAllStatus: function() {
  60.        var en = document.getElementById('filtercbx').checked;
  61.        document.getElementById('filterList').disabled = (!en);
  62.        document.getElementById('urllabel').disabled = (!en);
  63.        document.getElementById('urlbox').disabled = (!en);
  64.        this.updateAddButtonStatus();
  65.        this.updateDelButtonStatus();
  66.     },
  67.  
  68.     updateAddButtonStatus: function() {
  69.        var en = document.getElementById('filtercbx').checked;
  70.        var addbtn = document.getElementById('addbtn');
  71.        var urlbox = document.getElementById('urlbox');
  72.        addbtn.disabled = (!en) || (stmC.trim(urlbox.value).length < 1);
  73.     },
  74.  
  75.     updateDelButtonStatus: function() {
  76.        var en = document.getElementById('filtercbx').checked;
  77.        var delbtn = document.getElementById('delbtn');
  78.        var filter = document.getElementById('filterList');
  79.        delbtn.disabled = (!en) || (filter.view.selection.count < 1);
  80.     },
  81.  
  82.     updateApplyButton: function(e) {
  83.        document.getElementById("myExtra1").disabled = !e;
  84.     },
  85.  
  86.     onKeyPressed: function(e) {
  87.         if (e.keyCode==13 || e.keyCode ==46) {
  88.             switch(e.keyCode)
  89.             {
  90.                 case 13: // enter key
  91.                     if (document.activeElement.localName == "input") {
  92.                         e.preventDefault();
  93.                         e.stopPropagation();
  94.                         stmList.addNewURL();
  95.                     }
  96.                     break;
  97.                 case 46:
  98.                     if (document.activeElement.localName == "tree") stmList.delSelected();
  99.                     break;
  100.             }
  101.         }
  102.     },
  103.  
  104.     addNewURL: function() {
  105.        var filter = document.getElementById('filterList');
  106.        var urlbox = document.getElementById('urlbox');
  107.        var rule = stmC.trim(urlbox.value);
  108.        if (rule != "" && rule != "about:blank") {
  109.           if (rule.indexOf("://") < 0) {
  110.              rule = (/^[A-Za-z]:/.test(rule) ? "file:///"+rule.replace(/\\/g,"/") : "http://"+rule+"/");
  111.              if (/^file:\/\/.*/.test(rule)) rule = encodeURI(rule);
  112.           }
  113.           rule = rule.replace(/\s/g, "%20");
  114.           var idx = this.findRule(rule);
  115.           if (idx == -1) { idx = this.addFilterRule(rule, true); urlbox.value = ""; }
  116.           filter.view.selection.select(idx);
  117.           filter.boxObject.ensureRowIsVisible(idx);
  118.        }
  119.        this.updateAddButtonStatus();
  120.        urlbox.focus();
  121.     },
  122.  
  123.     findRule: function(value) {
  124.        var filter = document.getElementById('filterList');
  125.        var count = filter.view.rowCount;
  126.        for (var i=0; i<count; i++) {
  127.           var rule = filter.view.getCellText(i, filter.columns['columnRule']);
  128.           if (rule == value) return i;
  129.        }
  130.        return -1;
  131.     },
  132.  
  133.     delSelected: function() {
  134.        var filter = document.getElementById('filterList');
  135.        var rules = document.getElementById('filterChilds');
  136.        var selected, length;
  137.        if (filter.view.selection.count > 0) {
  138.           for (var i=rules.childNodes.length-1 ; i>=0 ; i--) {
  139.              if (filter.view.selection.isSelected(i)) {
  140.                   rules.removeChild(rules.childNodes[i]);
  141.                   selected = i;
  142.               }
  143.           }
  144.           length = rules.childNodes.length;
  145.           filter.view.selection.select(selected>length-1?length-1:selected);
  146.        }
  147.        this.updateDelButtonStatus();
  148.     },
  149.  
  150.     destory: function() {
  151.        var e = document.getElementById("filterChilds");
  152.        e.removeEventListener("DOMAttrModified", this.updateApplyButton, false);
  153.        e.removeEventListener("DOMNodeInserted", this.updateApplyButton, false);
  154.        e.removeEventListener("DOMNodeRemoved", this.updateApplyButton, false);
  155.     },
  156.  
  157.     setOptions: function() {
  158.        //apply the list
  159.        this.applyListToTabs(this.getPrefFilterList(), this.getFilterListString().split(" "));
  160.        //filter
  161.        var filter = document.getElementById('filtercbx').checked;
  162.        this.gPrefs.setBoolPref("pagelock.filter", filter);
  163.        var sString = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
  164.        sString.data = this.getFilterListString();
  165.        this.gPrefs.setComplexValue("pagelock.filterlist", Components.interfaces.nsISupportsString, sString);
  166.  
  167.        //update UI
  168.        this.updateApplyButton(false);
  169.     },
  170.  
  171.     getFilterListString: function() {
  172.        var list = [];
  173.        var filter = document.getElementById('filterList');
  174.        for (var i = 0; i < filter.view.rowCount; i++) {
  175.           var rule = filter.view.getCellText(i, filter.columns['columnRule']);
  176.           var enabled = filter.view.getCellValue(i, filter.columns['columnEnabled']);
  177.           var item = rule + (enabled=="true" ? "" : "\b");
  178.           list.push(item);
  179.        }
  180.        list.sort();
  181.        return list.join(" ");
  182.     },
  183.  
  184.     applyListToTabs: function(list, newlist) { 
  185.         var mw = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser");
  186.         var addedlist = stmC.listAminusB(newlist, list);
  187.         var deletedlist = stmC.listAminusB(list, newlist);
  188.         for(var j = 0; j < mw.gBrowser.browsers.length; j++) {
  189.             for (var i = 0; i < addedlist.length; i++) { 
  190.                 var item = addedlist[i].split("\b"); 
  191.                 if (item.length == 1) //enabled url
  192.                     if (item[0] == mw.gBrowser.getBrowserAtIndex(j).currentURI.spec) {
  193.                         mw.gBrowser.mTabs[j].setAttribute("isPageLocked", "true"); 
  194.                         break;
  195.                     }
  196.             }
  197.             for (var i = 0; i < deletedlist.length; i++) { 
  198.                 var item = deletedlist[i].split("\b"); 
  199.                 if (item.length == 1) //enabled url
  200.                     if (item[0] == mw.gBrowser.getBrowserAtIndex(j).currentURI.spec) {
  201.                         mw.gBrowser.mTabs[j].removeAttribute("isPageLocked"); 
  202.                         break;
  203.                     }
  204.             }
  205.         }   
  206.     },
  207.  
  208.     onDblClickFilterList: function(e) {
  209.        var filter = document.getElementById('filterList');
  210.        if (!filter.disabled && e.button == 0 && e.detail >= 2) {
  211.           if (filter.view.selection.count == 1) {
  212.              var urlbox = document.getElementById('urlbox');
  213.              urlbox.value = filter.view.getCellText(filter.currentIndex, filter.columns['columnRule']);
  214.              urlbox.select();
  215.              this.updateAddButtonStatus();
  216.           }
  217.        }
  218.     },
  219.  
  220.     restoreDefault: function() {
  221.        var branch = "extensions.stm.pagelock.filterlist";
  222.        var aTemp = this.getAllSettings(branch, false);
  223.        var aDefault = this.getAllSettings(branch, true);
  224.        this.setAllSettings(branch, aDefault);
  225.        this.initDialog();
  226.        this.setAllSettings(branch, aTemp);
  227.        this.updateApplyButton(true);
  228.     },
  229.  
  230.     getAllSettings: function(branch, isDefault) {
  231.        var prefservice = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  232.        var prefs = (isDefault ? prefservice.getDefaultBranch("") : prefservice.getBranch("") );
  233.        var preflist = prefs.getChildList(branch, {});
  234.  
  235.        var aList = [branch];
  236.        for (var i = 0 ; i < preflist.length ; i++) {
  237.           try {
  238.              var value = null;
  239.              switch (prefs.getPrefType(preflist[i])) {
  240.                  case prefs.PREF_BOOL:
  241.                     value = prefs.getBoolPref(preflist[i]);
  242.                     break;
  243.                  case prefs.PREF_INT:
  244.                     value = prefs.getIntPref(preflist[i]);
  245.                     break;
  246.                  case prefs.PREF_STRING:
  247.                     value = prefs.getComplexValue(preflist[i], Components.interfaces.nsISupportsString).data;
  248.                     break;
  249.              }
  250.              aList.push(preflist[i] + "=" + value);
  251.           } catch (e) {}
  252.        }
  253.        return aList;
  254.     },
  255.  
  256.     setAllSettings: function(branch, aList) {
  257.        if (!aList || aList.length == 0 || aList[0] != branch) return;
  258.  
  259.        var prefservice = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
  260.        var prefs = prefservice.getBranch("");
  261.  
  262.        var aPrefs = [];
  263.        for (var i = 1 ; i < aList.length ; i++){
  264.           var index = aList[i].indexOf("=");
  265.           if (index > 0){
  266.              var name = aList[i].substring(0, index);
  267.              var value = aList[i].substring(index+1, aList[i].length);
  268.              if (stmC.startWith(name, branch)) aPrefs.push([name, value]);
  269.           }
  270.        }
  271.        for (var i = 0 ; i < aPrefs.length ; i++) {
  272.           try {
  273.              var name = aPrefs[i][0];
  274.              var value = aPrefs[i][1];
  275.              switch (prefs.getPrefType(name)) {
  276.                  case prefs.PREF_BOOL:
  277.                     prefs.setBoolPref(name, /true/i.test(value));
  278.                     break;
  279.                  case prefs.PREF_INT:
  280.                     prefs.setIntPref(name, value);
  281.                     break;
  282.                  case prefs.PREF_STRING:
  283.                     if (value.indexOf('"') == 0) value = value.substring(1, value.length-1);
  284.                     var sString = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
  285.                     sString.data = value;
  286.                     prefs.setComplexValue(name, Components.interfaces.nsISupportsString, sString);
  287.                     break;
  288.              }
  289.           } catch (e) {}
  290.        }
  291.     },
  292.         
  293.     exportSettings: function() {
  294.        var aList = this.getAllSettings("extensions.stm.pagelock.filterlist");
  295.        if (aList) this.saveToFile(aList);
  296.     },
  297.  
  298.     importSettings: function() {
  299.        var aList = this.loadFromFile();
  300.        if (aList) {
  301.           this.setAllSettings("extensions.stm.pagelock.filterlist", aList);
  302.           this.initDialog();
  303.        }
  304.     },
  305.  
  306.     saveToFile: function(aList) {
  307.        var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
  308.        var stream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
  309.        var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].createInstance(Components.interfaces.nsIConverterOutputStream);
  310.  
  311.        fp.init(window, null, fp.modeSave);
  312.        fp.defaultExtension = "txt";
  313.        fp.defaultString = "Auto-Pagelock-URLs";
  314.        fp.appendFilters(fp.filterText);
  315.  
  316.        if (fp.show() != fp.returnCancel) {
  317.           try {
  318.              if (fp.file.exists()) fp.file.remove(true);
  319.              fp.file.create(fp.file.NORMAL_FILE_TYPE, 0666);
  320.              stream.init(fp.file, 0x02, 0x200, null);
  321.              converter.init(stream, "UTF-8", 0, 0x0000);
  322.  
  323.              for (var i = 0; i < aList.length ; i++) {
  324.                 converter.writeString(aList[i] + "\n");
  325.              }
  326.           } finally {
  327.              converter.close();
  328.              stream.close();
  329.           }
  330.        }
  331.     },
  332.  
  333.     loadFromFile: function() {
  334.        var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(Components.interfaces.nsIFilePicker);
  335.        var stream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
  336.        var converter = Components.classes["@mozilla.org/intl/converter-input-stream;1"].createInstance(Components.interfaces.nsIConverterInputStream);
  337.  
  338.        fp.init(window, null, fp.modeOpen);
  339.        fp.defaultExtension = "txt";
  340.        fp.appendFilters(fp.filterText);
  341.  
  342.        if (fp.show() != fp.returnCancel) {
  343.           try {
  344.              var input = {};
  345.              stream.init(fp.file, 0x01, 0444, null);
  346.              converter.init(stream, "UTF-8", 0, 0x0000);
  347.              converter.readString(stream.available(), input);
  348.              var linebreak = input.value.match(/(((\n+)|(\r+))+)/m)[1];
  349.              return input.value.split(linebreak);
  350.           } finally {
  351.              converter.close();
  352.              stream.close();
  353.           }
  354.        }
  355.        return null;
  356.     },
  357.  
  358. };//var end
  359.  
  360.